package leetcode.hot100;

import leetcode.common.TreeNode;

@SuppressWarnings("all")
public class _101_对称二叉树 {

    // 检查一棵二叉树是否是镜像对称的
    // 二叉树 [1,2,2,3,4,4,3] 是对称的
    public boolean isSymmetric(TreeNode root) {
        // 特殊：没有结点
        if (root == null) return true;
        return dfs(root.left, root.right);
    }

    boolean dfs(TreeNode left, TreeNode right) {
        // 镜像对称就是根结点的左子树和右子树相等
        // root.left.val = root.right.val后又递归比较
        // root.left.left.val = root.right.right.val 和 root.left.right.val = root.right.left.val

        // 只要是叶子结点，对于一个结点肯定是对称的（包含了只有一个根结点的情况）
        if (left == null && right == null) return true;
        // 说明当前root结点的左子树和右子树不全为null
        // 1.如果都不为空且结点相当的情况
        if (left != null && right != null && left.val != right.val) return false;
        // 2.如果其中一个子树为空，另一个子树不为空，那么肯定就是不对称的
        if (left == null || right == null) return false;
        return dfs(left.left, right.right) && dfs(left.right, right.left);
    }
}
